#!/bin/bash

# ===========================================
# Redis 8.2 一键卸载脚本
# 文件名 uninstall-redis-8.2.sh
# 适用于阿里云宝塔Linux系统
# 作者：无畏侠
# 版本：1.0
# 修改记录：
# v1.0 - 初始版本，完整卸载Redis 8.2及相关配置
# ===========================================

# 设置脚本参数（与安装脚本保持一致）
REDIS_VERSION="8.2.0"
REDIS_PASSWORD="Hlj@20220715"
REDIS_PORT="6379"
INSTALL_DIR="/usr/local/redis"
CONFIG_DIR="/etc/redis"
DATA_DIR="/var/lib/redis"
LOG_DIR="/var/log/redis"
PID_DIR="/var/run/redis"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_step() {
    echo -e "${BLUE}[STEP]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

# 检查是否以root用户运行
check_root() {
    if [[ $EUID -ne 0 ]]; then
        log_error "此脚本必须以root权限运行"
        exit 1
    fi
}

# 检测操作系统
detect_os() {
    if [ -f /etc/redhat-release ]; then
        OS="centos"
    elif [ -f /etc/lsb-release ]; then
        OS="ubuntu"
    elif [ -f /etc/debian_version ]; then
        OS="debian"
    else
        log_error "不支持的操作系统"
        exit 1
    fi
    log_info "检测到操作系统: $OS"
}

# 确认卸载操作
confirm_uninstall() {
    echo -e "${RED}===========================================${NC}"
    echo -e "${RED}            Redis 8.2 卸载确认           ${NC}"
    echo -e "${RED}===========================================${NC}"
    echo ""
    echo -e "${YELLOW}警告：此操作将永久删除以下内容：${NC}"
    echo ""
    echo -e "${RED}❌ Redis 服务及所有数据${NC}"
    echo -e "${RED}❌ Redis 配置文件${NC}"
    echo -e "${RED}❌ Redis 数据文件${NC}"
    echo -e "${RED}❌ Redis 日志文件${NC}"
    echo -e "${RED}❌ Redis 系统用户${NC}"
    echo -e "${RED}❌ Redis 防火墙规则${NC}"
    echo ""
    echo -e "${YELLOW}此操作不可逆！请确保已备份重要数据。${NC}"
    echo ""
    
    read -p "是否继续卸载？(yes/no): " confirm
    
    if [[ $confirm != "yes" ]]; then
        log_info "用户取消卸载操作"
        exit 0
    fi
}

# 检查Redis是否正在运行
check_redis_running() {
    log_step "检查Redis服务状态..."
    
    # 检查systemd服务
    if systemctl is-active --quiet redis; then
        log_info "Redis服务正在运行，正在停止服务..."
        systemctl stop redis
        sleep 2
    fi
    
    # 检查Redis进程
    if pgrep redis-server > /dev/null; then
        log_warn "发现Redis进程仍在运行，强制停止..."
        pkill redis-server
        sleep 3
        
        # 再次检查
        if pgrep redis-server > /dev/null; then
            log_error "无法停止Redis进程，请手动检查"
            exit 1
        fi
    fi
    
    log_info "Redis服务已停止"
}

# 禁用并删除systemd服务
remove_systemd_service() {
    log_step "处理systemd服务..."
    
    # 禁用服务
    if systemctl is-enabled redis > /dev/null 2>&1; then
        log_info "禁用Redis服务开机启动..."
        systemctl disable redis
    fi
    
    # 删除服务文件
    if [ -f "/etc/systemd/system/redis.service" ]; then
        log_info "删除systemd服务文件..."
        rm -f /etc/systemd/system/redis.service
        systemctl daemon-reload
        systemctl reset-failed
    fi
    
    log_info "systemd服务处理完成"
}

# 卸载Redis软件包
remove_redis_packages() {
    log_step "卸载Redis软件包..."
    
    case $OS in
        "centos")
            # 检查并卸载Redis包
            if rpm -qa | grep -q redis; then
                log_info "卸载Redis RPM包..."
                yum remove -y redis redis-server redis-tools
            fi
            ;;
        "ubuntu"|"debian")
            # 检查并卸载Redis包
            if dpkg -l | grep -q redis; then
                log_info "卸载Redis DEB包..."
                apt-get remove -y redis-server redis-tools
                apt-get autoremove -y
            fi
            ;;
    esac
    
    log_info "软件包卸载完成"
}

# 删除Redis编译安装的文件
remove_compiled_files() {
    log_step "删除编译安装的文件..."
    
    # 删除可执行文件
    log_info "删除Redis可执行文件..."
    rm -f /usr/local/bin/redis-*
    rm -f /usr/bin/redis-*
    
    # 删除源码目录
    if [ -d "/tmp/redis-${REDIS_VERSION}" ]; then
        log_info "删除Redis源码目录..."
        rm -rf /tmp/redis-${REDIS_VERSION}
    fi
    
    # 删除源码包
    if [ -f "/tmp/redis-${REDIS_VERSION}.tar.gz" ]; then
        log_info "删除Redis源码包..."
        rm -f /tmp/redis-${REDIS_VERSION}.tar.gz
    fi
    
    # 删除安装目录
    if [ -d "$INSTALL_DIR" ]; then
        log_info "删除Redis安装目录..."
        rm -rf $INSTALL_DIR
    fi
    
    log_info "编译文件删除完成"
}

# 删除Redis配置文件
remove_config_files() {
    log_step "删除Redis配置文件..."
    
    # 备份配置文件（可选）
    if [ -d "$CONFIG_DIR" ]; then
        log_info "备份配置文件到/tmp/redis-config-backup..."
        mkdir -p /tmp/redis-config-backup
        cp -r $CONFIG_DIR/* /tmp/redis-config-backup/ 2>/dev/null || true
    fi
    
    # 删除配置目录
    if [ -d "$CONFIG_DIR" ]; then
        log_info "删除Redis配置目录..."
        rm -rf $CONFIG_DIR
    fi
    
    # 删除其他可能的配置文件
    rm -f /etc/redis.conf
    rm -f /etc/redis/redis.conf
    
    log_info "配置文件删除完成"
}

# 删除Redis数据文件
remove_data_files() {
    log_step "删除Redis数据文件..."
    
    # 备份数据文件（可选）
    if [ -d "$DATA_DIR" ]; then
        log_info "备份数据文件到/tmp/redis-data-backup..."
        mkdir -p /tmp/redis-data-backup
        cp -r $DATA_DIR/* /tmp/redis-data-backup/ 2>/dev/null || true
    fi
    
    # 删除数据目录
    if [ -d "$DATA_DIR" ]; then
        log_info "删除Redis数据目录..."
        rm -rf $DATA_DIR
    fi
    
    # 删除其他可能的数据目录
    rm -rf /var/db/redis
    rm -rf /opt/redis
    
    log_info "数据文件删除完成"
}

# 删除Redis日志文件
remove_log_files() {
    log_step "删除Redis日志文件..."
    
    # 删除日志目录
    if [ -d "$LOG_DIR" ]; then
        log_info "删除Redis日志目录..."
        rm -rf $LOG_DIR
    fi
    
    # 删除其他可能的日志文件
    rm -f /var/log/redis*.log
    rm -f /var/log/redis-server.log
    
    log_info "日志文件删除完成"
}

# 删除PID文件目录
remove_pid_files() {
    log_step "删除Redis PID文件..."
    
    # 删除PID目录
    if [ -d "$PID_DIR" ]; then
        log_info "删除Redis PID目录..."
        rm -rf $PID_DIR
    fi
    
    # 删除其他可能的PID文件
    rm -f /var/run/redis*.pid
    rm -f /run/redis*.pid
    
    log_info "PID文件删除完成"
}

# 清理防火墙规则
clean_firewall_rules() {
    log_step "清理防火墙规则..."
    
    case $OS in
        "centos")
            if systemctl is-active --quiet firewalld; then
                log_info "清理firewalld规则..."
                firewall-cmd --permanent --remove-port=${REDIS_PORT}/tcp 2>/dev/null || true
                firewall-cmd --reload
            fi
            ;;
        "ubuntu"|"debian")
            if command -v ufw > /dev/null && ufw status | grep -q "Status: active"; then
                log_info "清理ufw规则..."
                ufw delete allow ${REDIS_PORT}/tcp 2>/dev/null || true
                ufw reload
            fi
            ;;
    esac
    
    # 清理iptables规则
    if command -v iptables > /dev/null; then
        log_info "清理iptables规则..."
        iptables -D INPUT -p tcp --dport ${REDIS_PORT} -j ACCEPT 2>/dev/null || true
        iptables-save > /etc/sysconfig/iptables 2>/dev/null || true
    fi
    
    log_info "防火墙规则清理完成"
}

# 删除Redis系统用户
remove_redis_user() {
    log_step "处理Redis系统用户..."
    
    # 检查Redis用户是否存在
    if id redis &>/dev/null; then
        log_info "删除Redis系统用户..."
        
        # 先检查是否有其他进程使用redis用户
        if pgrep -u redis > /dev/null; then
            log_warn "发现其他进程使用redis用户，请先处理这些进程"
            pgrep -u redis | xargs ps -o pid,cmd -p
            log_warn "建议手动处理这些进程后再删除用户"
            return
        fi
        
        # 删除用户和组
        userdel redis 2>/dev/null || true
        groupdel redis 2>/dev/null || true
        
        log_info "Redis用户删除完成"
    else
        log_info "Redis用户不存在，跳过删除"
    fi
}

# 清理环境变量
clean_environment() {
    log_step "清理环境变量..."
    
    # 从bash配置文件中移除Redis相关设置
    for file in /etc/profile /etc/bash.bashrc ~/.bashrc ~/.bash_profile; do
        if [ -f "$file" ]; then
            # 移除REDIS_HOME等环境变量设置
            sed -i '/REDIS_HOME/d' "$file" 2>/dev/null || true
            sed -i '/redis/d' "$file" 2>/dev/null || true
        fi
    done
    
    log_info "环境变量清理完成"
}

# 验证卸载结果
verify_uninstallation() {
    log_step "验证卸载结果..."
    
    local uninstall_success=true
    
    # 检查Redis进程
    if pgrep redis-server > /dev/null; then
        log_error "❌ Redis进程仍然存在"
        uninstall_success=false
    else
        log_info "✅ Redis进程已停止"
    fi
    
    # 检查可执行文件
    if command -v redis-server > /dev/null; then
        log_error "❌ Redis可执行文件仍然存在"
        uninstall_success=false
    else
        log_info "✅ Redis可执行文件已删除"
    fi
    
    # 检查配置文件目录
    if [ -d "$CONFIG_DIR" ]; then
        log_error "❌ Redis配置目录仍然存在"
        uninstall_success=false
    else
        log_info "✅ Redis配置目录已删除"
    fi
    
    # 检查数据目录
    if [ -d "$DATA_DIR" ]; then
        log_warn "⚠️  Redis数据目录仍然存在（可能包含重要数据）"
    else
        log_info "✅ Redis数据目录已删除"
    fi
    
    if $uninstall_success; then
        log_info "✅ Redis卸载验证通过"
    else
        log_error "❌ Redis卸载验证失败，请检查上述问题"
        return 1
    fi
}

# 显示卸载摘要
show_uninstall_summary() {
    log_step "=== 卸载完成 ==="
    echo -e "${GREEN}Redis ${REDIS_VERSION} 卸载完成${NC}"
    echo ""
    echo -e "${BLUE}卸载摘要:${NC}"
    echo "=============================="
    echo -e "Redis版本: ${RED}${REDIS_VERSION}${NC}"
    echo -e "卸载时间: $(date '+%Y-%m-%d %H:%M:%S')"
    echo ""
    echo -e "${YELLOW}重要提醒:${NC}"
    echo "=============================="
    echo "1. 备份文件保存在 /tmp/redis-*-backup/ 目录"
    echo "2. 如需重新安装，请运行 install-redis-8.2.sh"
    echo "3. 建议重启系统以确保完全清理"
    echo ""
    
    # 显示备份文件信息
    if [ -d "/tmp/redis-config-backup" ]; then
        echo -e "${GREEN}配置文件备份:${NC}"
        ls -la /tmp/redis-config-backup/ 2>/dev/null || echo "无配置文件备份"
        echo ""
    fi
    
    if [ -d "/tmp/redis-data-backup" ]; then
        echo -e "${GREEN}数据文件备份:${NC}"
        ls -la /tmp/redis-data-backup/ 2>/dev/null || echo "无数据文件备份"
        echo ""
    fi
}

# 主函数
main() {
    echo -e "${RED}===========================================${NC}"
    echo -e "${RED}    Redis ${REDIS_VERSION} 一键卸载脚本    ${NC}"
    echo -e "${RED}===========================================${NC}"
    echo ""
    
    # 确认卸载操作
    confirm_uninstall
    
    # 执行卸载步骤
    check_root
    detect_os
    check_redis_running
    remove_systemd_service
    remove_redis_packages
    remove_compiled_files
    remove_config_files
    remove_data_files
    remove_log_files
    remove_pid_files
    clean_firewall_rules
    remove_redis_user
    clean_environment
    verify_uninstallation
    show_uninstall_summary
    
    echo -e "${GREEN}卸载完成！${NC}"
}

# 执行主函数
main "$@"